home *** CD-ROM | disk | FTP | other *** search
/ MacTech 1 to 12 / MacTech-vol-1-12.toast / Source / MacTech® Magazine / Volume 07 - 1991 / 07.10 Oct 91 / Window Menubar Source ƒ / wBMBalloons.p < prev    next >
Encoding:
Text File  |  1991-07-25  |  5.6 KB  |  238 lines  |  [TEXT/PJMM]

  1. { ******************************************************** }
  2. { "wBMBalloons.p"                                          }
  3. {                                                          }
  4. { by John A. Love, III [ Washington Apple Pi Users' Group] }
  5. {                                                          }
  6. { using Symantec's "THINK Lightspeed Pascal", v 3.02       }
  7. {                                                          }
  8. { ******************************************************** }
  9.  
  10.  
  11. UNIT wBMBalloons;
  12.  
  13. INTERFACE
  14.  
  15.     USES
  16.         Types, Quickdraw, Menus, TextEdit, Traps, GestaltEqu, Balloons, wBMGlobals, wBMMiscSubs, wBMScrollSubs;
  17.  
  18.  
  19.     FUNCTION HelpManagerActive: BOOLEAN;
  20.     FUNCTION BalloonsOn: BOOLEAN;
  21.     FUNCTION BalloonShowing: BOOLEAN;
  22.     PROCEDURE FindAndShowDynamicBalloons (balloonsUp: BOOLEAN; window: WindowPtr);
  23.     PROCEDURE HideBalloons (balloonsUp: BOOLEAN);
  24.     PROCEDURE ShowBalloons (balloonsUp: BOOLEAN);
  25.     PROCEDURE ResetBalloons (balloonsUp: BOOLEAN);
  26.  
  27.  
  28.  
  29.  
  30. IMPLEMENTATION
  31.  
  32.  
  33.  
  34.  
  35.     FUNCTION HelpManagerActive: BOOLEAN;
  36. { Do we have a machine on which the Help Manager exists ??? }
  37.  
  38.         CONST
  39.             _Gestalt = $A1AD;
  40.  
  41.         VAR
  42.             myFeature: LONGINT;
  43.  
  44.     BEGIN
  45.  
  46.         HelpManagerActive := FALSE;          { Pessimism is the order of the day !!! }
  47.  
  48.         IF TrapAvailable(_Gestalt) THEN
  49.             IF Gestalt(gestaltHelpMgrAttr, myFeature) = noErr THEN
  50.                 IF BitTst(@myFeature, 31 - gestaltHelpMgrPresent) THEN
  51.                     HelpManagerActive := TRUE;
  52.  
  53.     END;   { HelpManagerActive }
  54.  
  55.  
  56.  
  57.     FUNCTION BalloonsOn: BOOLEAN;
  58. { Has the user selected "Show Balloons" ??? }
  59.  
  60.     BEGIN
  61.  
  62.         BalloonsOn := HelpManagerActive & HMGetBalloons;
  63.  
  64.     END;   { BalloonsOn }
  65.  
  66.  
  67.  
  68.     FUNCTION BalloonShowing: BOOLEAN;
  69. { Is a Balloon currently showing ??? }
  70.  
  71.     BEGIN
  72.  
  73.         BalloonShowing := HelpManagerActive & HMIsBalloon;
  74.  
  75.     END;   { BalloonShowing }
  76.  
  77.  
  78.  
  79.     PROCEDURE FindAndShowDynamicBalloons (balloonsUp: BOOLEAN; window: WindowPtr);
  80.  
  81.         CONST
  82.             stdWDEF = 0;
  83.             defVar = 0;
  84.             notMine = -1;
  85.  
  86.         VAR
  87.             i: INTEGER;
  88.             mouse: Point;
  89.             savePort: GrafPtr;
  90.             inRect: BOOLEAN;
  91.  
  92.         FUNCTION ShowMyNewBalloon (altRect: Rect; tipProc: Ptr; strID, strIndex, theProc, variant, method: INTEGER): OSErr;
  93.  
  94.             VAR
  95.                 helpMsg: HMMessageRecord;
  96.                 tip: Point;
  97.  
  98.         BEGIN
  99.  
  100.             LocalGlobal(altRect);
  101.             WITH altRect DO            { Center the tip. }
  102.                 SetPt(tip, (right + left) DIV 2, (bottom + top) DIV 2);
  103.             ;
  104.             WITH helpMsg DO            { Fill in HMMessageRecord. }
  105.             BEGIN
  106.                 hmmHelpType := khmmStringRes;
  107.                 hmmStringRes.hmmResID := strID;
  108.                 hmmStringRes.hmmIndex := strIndex;
  109.             END;   { WITH helpMsg)}
  110.             ;
  111.             ShowMyNewBalloon := HMShowBalloon(helpMsg, tip, NIL, tipProc, theProc, variant, method);
  112.  
  113.         END;   { ShowMyNewBalloon }
  114.  
  115.  
  116.         FUNCTION RemoveMyOldBalloon: OSErr;
  117.  
  118.         BEGIN
  119.  
  120.             RemoveMyOldBalloon := noErr;
  121.             IF lastBalloon <> notMine THEN          { All MINE !! }
  122.                 IF PtInRect(mouse, window^.portRect) THEN
  123.         { If NOT ...for example, if in window's title bar, }
  124.         { the Finder will remove my balloon for me.        }
  125.                     RemoveMyOldBalloon := HMRemoveBalloon;
  126.  
  127.         END;   { RemoveMyOldBalloon }
  128.  
  129.  
  130.     BEGIN   { FindAndShowDynamicBalloons }
  131.  
  132. { Only the NEW windows can be dynamically sized . The initial rDocProc }
  133. { window is a static window; however, both window types have hot rects }
  134. { that vary in size with the presence of a Radius BIG screen.          }
  135. { Therefore , I do NOT have 'hwin' and 'hrct' resources in this file . }
  136.  
  137.         IF balloonsUp & (window <> NIL) THEN
  138.             IF NOT currDA & myAppl THEN            { Neither a DA nor suspended. }
  139.                 IF NOT StillDown THEN                { My scrolling WMB. }
  140.                 BEGIN
  141.  
  142.         { GetPort(savePort);   --   already = FrontWindow }
  143.         { SetPort(window);                                }
  144.                     GetMouse(mouse);
  145.                     inRect := FALSE;
  146.  
  147.                     IF NOT EventAvail(updateMask, Event) THEN
  148.                         IF PtInRect(mouse, WBMrect) THEN
  149.                             FOR i := 0 TO 2 DO
  150.                                 IF PtInRect(mouse, dynamicBalloons[i].dynamicR) THEN
  151.                                 BEGIN
  152.                                     IF i <> lastBalloon THEN
  153.                                     BEGIN
  154.                                         IF RemoveMyOldBalloon = noErr THEN
  155.                                             ;
  156.                                         IF ShowMyNewBalloon(dynamicBalloons[i].dynamicR, NIL, dynamicBalloons[i].dynamicStrID, dynamicBalloons[i].dynamicStrIndex, stdWDEF, defVar, kHMSaveBitsNoWindow) = noErr THEN
  157.                                             lastBalloon := i;
  158.                                     END;   { i <> lastBalloon }
  159.                                     ;
  160.                                     inRect := true;
  161.                                     Leave;
  162.                                 END;   { NOT EventAvail & Cursor in WBMrect }
  163.  
  164.                     IF NOT inRect THEN
  165.                     BEGIN
  166.                         IF RemoveMyOldBalloon = noErr THEN
  167.                             ;
  168.                         lastBalloon := notMine;
  169.                     END;
  170.  
  171.         { SetPort(savePort);   --   see above }
  172.  
  173.                 END   { Initial 3 IFs }
  174.                 ELSE
  175.                     lastBalloon := notMine;
  176.  
  177.     END;   { FindAndShowDynamicBalloons }
  178.  
  179.  
  180.  
  181.     PROCEDURE HideBalloons (balloonsUp: BOOLEAN);
  182.  
  183.         VAR
  184.             soWhat: OSErr;
  185.  
  186.     BEGIN
  187.  
  188.         IF balloonsUp THEN
  189.         BEGIN
  190.             IF BalloonShowing THEN
  191.       { Get the daggum monster out of the way !! }
  192.       { Used "hmSaveBitsNoWindow option" so bits }
  193.       { are restored withOUT an update Event.    }
  194.                 soWhat := HMRemoveBalloon;
  195.             ;
  196.     { Okay, I've restored the bits.  However, now   }
  197.     { I've got to temporarily disable Balloon Help  }
  198.     { until I leave with a Mouse Up Event or finish }
  199.     { with whatever:                                }
  200.             soWhat := HMSetBalloons(false);
  201.             ;
  202.             lastBalloon := -1;
  203.         END;   { "Show Balloons" active }
  204.  
  205.     END;   { HideBalloons }
  206.  
  207.  
  208.  
  209.     PROCEDURE ShowBalloons (balloonsUp: BOOLEAN);
  210. { NOW !!! I can safely re-enable Balloon Help: }
  211.  
  212.         VAR
  213.             soWhat: OSErr;
  214.  
  215.     BEGIN
  216.  
  217.         IF balloonsUp THEN
  218.             soWhat := HMSetBalloons(true);
  219.  
  220.     END;   { ShowBalloons }
  221.  
  222.  
  223.  
  224.     PROCEDURE ResetBalloons (balloonsUp: BOOLEAN);
  225.  
  226.     BEGIN
  227.  
  228.         IF balloonsUp THEN
  229.             ShowBalloons(true)
  230.         ELSE
  231.             HideBalloons(HelpManagerActive);
  232.  
  233.     END;   { ResetBalloons }
  234.  
  235.  
  236.  
  237.  
  238. END.   { UNIT = wBMBalloons }